#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event.h>
#include <unistd.h>
#include <string>
#include <vector>
#include <map>
#include <fstream>
#include "jsoncpp/json/json.h"
#include "publicstruct.h"

/*
对于一个event_base结构来说，它会保存一系列的event事件并且以轮训的方式去关注每一个事件，
去查看哪一个事件是就绪的，事件就绪之后，就会调用事件回调
*/

// 线程类
class Thread
{
public:
    Thread(/* args */);
    ~Thread();
    // 运行线程
    void start();
    // 将客户端的通信套接字转化为事件 添加到事件集合
    void addEvent(int fd);
    // 获取线程ID
    inline pthread_t getThreadID() { return this->m_threadID; }
    // 解析客户端发来的请求
    void analysisRequest(const string &request, bufferevent *bev);

    // 处理登录请求
    void dealLoginRequest(Json::Value root, bufferevent *bev);
    // 处理注册请求
    void dealRegisterRequest(Json::Value root, bufferevent *bev);
    // 处理验证码请求 
    void dealSendCodeRequest(Json::Value root, bufferevent *bev);
    // 处理数据获取请求
    void dealGetDataRequest(Json::Value root, bufferevent *bev);
    // 处理添加好友请求
    void dealAddFriendRequest(Json::Value root, bufferevent *bev);
    // 处理用户离线
    void dealUserQuit(Json::Value root, bufferevent *bev);
    // 添加好友处理结果
    void dealAddFriendReply(Json::Value root, bufferevent *bev);
    // 处理删除好友报文
    void dealDeleteFriend(Json::Value root, bufferevent *bev);
    // 处理私聊消息
    void dealPrivateChat(Json::Value root, bufferevent *bev);
    // 处理拉取请求
    void dealPullRequest(Json::Value root, bufferevent *bev);
    // 处理文件头
    void dealFileHead(Json::Value root, bufferevent *bev);
    // 处理文件上传完毕
    void dealUpLoadFinish(Json::Value root, bufferevent *bev);
    // 处理创建群聊
    void dealCreateGroup(Json::Value root, bufferevent *bev);
    // 处理群主解散群聊
    void dealDissolveGroup(Json::Value root, bufferevent *bev);
    // 处理用户退出群聊
    void dealQuitGroup(Json::Value root, bufferevent *bev);
    // 处理添加群聊请求
    void dealAddGroup(Json::Value root, bufferevent *bev);
    // 处理群聊消息
    void dealGroupChat(Json::Value root, bufferevent *bev);
    // 处理发表动态
    void dealAnnounceFeed(Json::Value root, bufferevent *bev);
    // 处理动态拉取请求
    void dealFeedPullRequest(Json::Value root, bufferevent *bev);
    // 评论动态
    void dealPLFeed(Json::Value root, bufferevent *bev);
    // 点赞动态
    void dealLikeFeed(Json::Value root, bufferevent *bev);
    // 处理点赞评论拉取请求
    void dealDZPLPullRequest(Json::Value root, bufferevent *bev);
    // 取消点赞动态
    void dealUnlikeFeed(Json::Value root, bufferevent *bev);
    // 消息漫游
    void dealGetHistoryMsg(Json::Value root, bufferevent *bev);
    // 群消息漫游
    void dealGetHistoryMsgGroup(Json::Value root, bufferevent *bev);
    // 群文件上传
    void dealUploadGroupFile(Json::Value root, bufferevent *bev);
    // 准备动态相关数据
    void dealGetFeed(Json::Value root, bufferevent *bev);
    // 准备点赞评论相关数据
    void dealGetDzpl(Json::Value root, bufferevent *bev);
    // 群文件下载请求
    void dealDownloadGroupFile(Json::Value root, bufferevent *bev);
    // 准备群文件、群通知、群成员
    void dealGetGroupFile(Json::Value root, bufferevent *bev);
    // 编辑个人资料
    void dealModifyUserInfo(Json::Value root, bufferevent *bev);
    // 发布群公告
    void dealReleaseGroupNotice(Json::Value root, bufferevent *bev);

public:
    // 判断用户是否在线
    struct bufferevent *judgeUserOnline(int uid);
    // 判断用户是否在群里
    int isGroupMember(int uid, int gid);
    // 更新群关系表,插入一条记录
    void insertGRT(int uid, int gid);
    // 更新群关系表,删除一条记录
    void deleteGRT(int uid, int gid);
    // 根据用户号返回用户信息
    struct st_fData getUserInfo(int uid);
    // 根据群ID返回群资料
    struct st_gData getGroupInfo(int gid);
    // 获取群中所有用户的ID
    vector<int> getGroupAllUserID(int gid);
    // 获取用户的好友列表
    vector<st_fData> getFriends(int uid);
    // 获取用户的好友列表（只获取ID）
    vector<int> getFriendsID(int uid);
    // 获取用户的群组列表
    vector<st_gData> getGroups(int uid);
    // 获取查询结果的好友列表
    vector<st_fData> getSearchInfo(int uid,const string& sex);
    vector<st_fData> getSearchInfo(const string &nick,const string& sex);
    // 获取查询结果的群列表
    vector<st_gData> getSearchGroupInfo(int gid);
    vector<st_gData> getSearchGroupInfo(const string &gname);
    // 获取群的群成员列表
    vector<st_gMemberData> getGroupMembers(int gid);
    // 将消息持久化到消息存储库
    void toMsgStorageDB(struct st_msg);
    // 将消息推送到消息同步库
    void toMsgSyncDB(struct st_msg);
    // 将消息添加到用户的同步TimeLine
    void toSyncTimeLine(int uid, struct st_msg msg);
    // 从同步库中删除数据(用户拉取完数据后,删除同步库中的数据)
    void deleteMsgFromSyncDB(int uid);
    // 字符串分割函数
    vector<string> split(const string &str, char delimiter);
    // 判断手机号是否已被其他用户注册
    bool phoneAlreadyRegister(const string &phone);
    // 将动态持久化到动态存储库(发布表)
    void toFeedStorageDB(struct st_feed);
    // 将动态同步到用户的Feed同步TimeLine
    void toFeedSyncTimeLine(int uid,struct st_feed feed);
    // 将评论持久化到点赞评论表
    void toDZPLDB(struct st_dzpl dzpl);
    // 从点赞评论表删除对应记录
    void removeFromDZPLDB(struct st_dzpl dzpl);
    // 将点赞评论同步到用户的dzpl同步TimeLine
    void toDZPLSyncTimeLine(int uid,struct st_dzpl dzpl);
    // 群文件信息持久化到文件库
    void toFileDB(struct st_file file);
    // 根据用户号查找用户以及所有好友的相关动态ID
    vector<string> getFeedsID(int uid);
    // 判断群聊是否存在
    bool isGroupExist(int gid);
    

protected:
    // 线程的工作函数
    static void *work(void *arg);
    // 读缓冲可读的回调函数
    static void read_cb(struct bufferevent *bev, void *arg);
    // 写缓冲可写的回调函数
    static void write_cb(struct bufferevent *bev, void *arg);
    // 其他事件的回调函数
    static void event_cb(struct bufferevent *bev, short events, void *arg);
    // 管道的回调函数
    static void pipe_cb(bufferevent *bev, void *arg);

private:
    struct event_base *m_base; // 事件集合
    pthread_t m_threadID;      // 线程ID

    struct bufferevent *m_pipeEvent; // 管道事件
};
